home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / geometry / hpoint3 / hpoint3b.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-10  |  3.6 KB  |  199 lines

  1. /* Copyright (c) 1992 The Geometry Center; University of Minnesota
  2.    1300 South Second Street;  Minneapolis, MN  55454, USA;
  3.    
  4. This file is part of geomview/OOGL. geomview/OOGL is free software;
  5. you can redistribute it and/or modify it only under the terms given in
  6. the file COPYING, which you should have received along with this file.
  7. This and other related software may be obtained via anonymous ftp from
  8. geom.umn.edu; email: software@geom.umn.edu. */
  9.  
  10. /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */
  11.  
  12. #
  13. /*
  14. **    hpoint3.c - procedural interface to 3D point geometry
  15. **
  16. **    pat hanrahan
  17. */
  18.  
  19. #include <math.h>
  20. #include "hg4.h"
  21. #include "point3.h"
  22. #include "hpoint3.h"
  23. #include "hplane3.h"
  24. #include "hline3.h"
  25. #include "transform3.h"
  26. #include "tolerance.h"
  27.  
  28. HPoint3 *
  29. HPt3Create()
  30. {
  31.     return (HPoint3 *) Hg4Create();
  32. }
  33.  
  34. void
  35. HPt3Delete( pt )
  36.     HPoint3 *pt;
  37. {
  38.     Hg4Delete( (Hg4Tensor1 *) pt );
  39. }
  40.  
  41. void
  42. HPt3Print( pt )
  43.     HPoint3 *pt;
  44. {
  45.     Hg4Print( (Hg4Tensor1 *) pt );
  46. }
  47.  
  48. void
  49. HPt3Add( pt1, pt2, pt3 )
  50.     HPoint3 *pt1, *pt2, *pt3;
  51. {
  52.     Hg4Add( (Hg4Tensor1 *) pt1, (Hg4Tensor1 *) pt2 , (Hg4Tensor1 *) pt3);
  53. }
  54.  
  55.  
  56. void
  57. HPt3From( pt, x, y, z, w )
  58.     HPoint3 *pt;
  59.     HPt3Coord x, y, z, w;
  60. {
  61.     Hg4From( (Hg4Tensor1 *)pt, x, y, z, w );
  62. }
  63.  
  64. int
  65. HPt3From3HPl3s( pt, pl1, pl2, pl3 )
  66.     HPoint3 *pt;
  67.     HPlane3 *pl1, *pl2, *pl3;
  68. {
  69.     return Hg4Intersect3( 
  70.     (Hg4Tensor1 *)pl1, (Hg4Tensor1 *)pl2, (Hg4Tensor1 *)pl3,
  71.     (Hg4Tensor1 *)pt, 1 );
  72. }
  73.  
  74. int
  75. HPt3From2HLn3s( pt, ln1, ln2 )
  76.     HPoint3 *pt;
  77.     HLine3 *ln1, *ln2;
  78. {
  79.     HPlane3 pl;
  80.  
  81.     return HLn3IntersectHLn3( ln1, ln2, &pl, pt );
  82. }
  83.  
  84. int
  85. HPt3IntersectHPt3( pt1, pt2, ln )
  86.     HPoint3 *pt1, *pt2;
  87.     HLine3 *ln;
  88. {
  89.     return HLn3From2HPt3s( ln, pt1, pt2 );
  90. }
  91.  
  92. void
  93. HPt3Pencil( t1, pt1, t2, pt2, pt3 )
  94.     HPt3Coord t1, t2;
  95.     HPoint3 *pt1, *pt2, *pt3;
  96. {
  97.     Hg4Pencil( t1, (Hg4Tensor1 *)pt1, t2, (Hg4Tensor2 *)pt2, (Hg4Tensor1 *)pt3);
  98. }
  99.  
  100. float
  101. HPt3DotHPl3( pt, pl )
  102.     HPoint3 *pt;
  103.     HPlane3 *pl;
  104. {
  105.     return Hg4ContractPiQi( (Hg4Tensor1 *)pt, (Hg4Tensor1 *)pl );
  106. }
  107.  
  108. int
  109. HPt3Compare( pt1, pt2 )
  110.     HPoint3 *pt1, *pt2;
  111. {
  112.     return Hg4Compare( (Hg4Tensor1 *)pt1, (Hg4Tensor1 *)pt2 );
  113. }
  114.  
  115. int
  116. HPt3Undefined( pt )
  117.     HPoint3 *pt;
  118. {
  119.     return Hg4Undefined( (Hg4Tensor1 *)pt );
  120. }
  121.  
  122. int
  123. HPt3Infinity( pt )
  124.     HPoint3 *pt;
  125. {
  126.     return Hg4Infinity( (Hg4Tensor1 *)pt, 0 );
  127. }
  128.  
  129. int
  130. HPt3CoincidentHPl3( pt, pl )
  131.     HPoint3 *pt;
  132.     HPlane3 *pl;
  133. {
  134.     return fzero(HPt3DotHPl3(pt,pl));
  135. }
  136.  
  137. int
  138. HPt3CoincidentHLn3( pt, ln )
  139.     HPoint3 *pt;
  140.     HLine3 *ln;
  141. {
  142.     HPlane3 pl;
  143.  
  144.     return HLn3IntersectHPt3( ln, pt, &pl );
  145. }
  146.  
  147. int
  148. HPt3CoincidentHPt3( pt1, pt2 )
  149.     HPoint3 *pt1, *pt2;
  150. {
  151.     return Hg4Coincident( (Hg4Tensor1 *)pt1, (Hg4Tensor1 *)pt2 );
  152. }
  153.  
  154.  
  155. /* Fishy procedure */
  156. void
  157. HPt3Dual( pt, pl )
  158.     HPoint3 *pt;
  159.     HPlane3 *pl;
  160. {
  161.     pl->a = pt->x;
  162.     pl->b = pt->y;
  163.     pl->c = pt->z;
  164.     pl->d = pt->w;
  165. }
  166.  
  167. void
  168. HPt3LinSum (scale1, in1, scale2, in2, out)
  169.     HPt3Coord scale1, scale2;
  170.     HPoint3 *in1, *in2, *out;
  171. {
  172.     if ((in1->w == 0) || (in2->w == 0)) {
  173.     out->w = 0;
  174.     out->x = scale1 * in1->x + scale2 * in2->x;
  175.     out->y = scale1 * in1->y + scale2 * in2->y;
  176.     out->z = scale1 * in1->z + scale2 * in2->z;
  177.     return;
  178.     }
  179.     out->w = 1;
  180.     out->x = scale1 * (in1->x/in1->w) + scale2 * (in2->x/in2->w);
  181.     out->y = scale1 * (in1->y/in1->w) + scale2 * (in2->y/in2->w);
  182.     out->z = scale1 * (in1->z/in1->w) + scale2 * (in2->z/in2->w);
  183. }
  184.  
  185. void
  186. HPt3SizeOne (pt, out)
  187. HPoint3 *pt;
  188. HPoint3 *out;
  189. {
  190.     HPt3Coord size;
  191.  
  192.     size = sqrt (pt->x * pt->x + pt->y * pt->y + pt->z * pt->z);
  193.     if (size == 0) return;
  194.     out->x = pt->x / size;
  195.     out->y = pt->y / size;
  196.     out->z = pt->z / size;
  197.     out->w = 1.;
  198. }
  199.